function LList(){
    //每个链表先去创建一个头结点
    this.head=new Node("head");
    this.find=find;
    this.insert=insert;
    this.remove=remove;
    this.display=display;
    this.displayReverse=displayReverse;
    this.findLast=findLast;
    this.currNode=this.head;
    this.advance=advance;
    this.back=back;
    this.show=show;
}

//双向链表比单链表多了一个前驱节点
//原理差不多，但是要改变方法，而且不用找前驱元素这个方法了
//先改node类
function Node(element){
    this.element=element;
    this.next=null;
    this.previous=null;
}
//插入数据的时候有要改变,
//双向链表，你插入的时候，先找到你要插入到哪里的元素，然后如果插入到他后面，让新元素的后继元素等于当前元素的后级元素，
// 让新元素的前驱等于当前元素的next，一定要注意顺序，不然会先被覆盖，让当前元素的next等于新元素
function insert(newElement,item){
    var newNode=new Node(newElement);
    var currNode=this.find(item);
    newNode.next=currNode.next;
    newNode.previous=currNode;
    currNode.next=newNode;
}

//删除双向链表的元素
//原理：先找到这个元素，让当前元素的前驱节点的next执行当前元素的后集结点，
//让当前元素的后集结点的前驱节点指向当前元素的前驱节点，然后释放当前node实例
function remove(item){
    var currNode=this.find(item);
    //console.log(currNode.next);
    if(!(currNode.next===null)) {
        currNode.previous.next = currNode.next;
        currNode.next.previous = currNode.previous;
        currNode.next = null;
        currNode.previous = null;
    }else{
        currNode.previous.next=null;
        currNode.next=null;
        currNode.previous=null;
    }
}
//双向链表可以倒过来访问所以我们可以协议额找最后一个元素的方法，这样就可以倒序输出了
function findLast(){
    var currNode=this.head;
    while(!(currNode.next===null)){
        currNode=currNode.next;
    }
    return currNode;
}

//翻转输出
//先找到最后一个节点，然后通过查询前驱节点反向输出。
function displayReverse(){
    var currNode=this.head;//我觉得这句都不用了，之生命一个currNode就可以了。
    currNode=this.findLast();
    while(!(currNode.previous===null)){
        console.log(currNode.element);
        currNode=currNode.previous;
    }
}

function display(){
    var currNode=this.head;
    while(!(currNode.next==null)){
        console.log(currNode.next.element);
        currNode=currNode.next;
    }
}

function find(item){
    //这个currNode获取的是这条链表的头结点，所以你获取的是LList中的head的这个node节点
    //这个node节点有两个属性，一个next一个element
    var currNode=this.head;
    while(currNode.element!==item){
        currNode=currNode.next;
    }
    return currNode;
}
//向前移动n个位置
function advance(n){
    while(n>0&&(this.currNode.next!=null)){
        this.currNode=this.currNode.next;
        n--;
    }
}
//back和advance的原理相同：让当前节点这个指针指向下一个节点，或者前一个节点
function back(n){
    while(n>0&&(this.currNode.previous!=null)){
        this.currNode=this.currNode.previous;
        n--;
    }
}

//show：显示当前节点的内容
function show(){
    return this.currNode.element;
}
